home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / gas_251.zip / bin_251 / bfd / aout-encap.c < prev    next >
C/C++ Source or Header  |  1994-07-12  |  7KB  |  237 lines

  1. /* BFD back-end for a.out files encapsulated with COFF headers.
  2.    Copyright (C) 1990, 1991 Free Software Foundation, Inc.
  3.  
  4. This file is part of BFD, the Binary File Descriptor library.
  5.  
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 of the License, or
  9. (at your option) any later version.
  10.  
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with this program; if not, write to the Free Software
  18. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. /* THIS MODULE IS NOT FINISHED.  IT PROBABLY DOESN'T EVEN COMPILE.  */
  21.  
  22. #if 0
  23. #define    PAGE_SIZE    4096
  24. #define    SEGMENT_SIZE    PAGE_SIZE
  25. #define TEXT_START_ADDR 0
  26. #define BYTES_IN_WORD 4
  27. #endif
  28.  
  29. #include "bfd.h"
  30. #include <sysdep.h>
  31. #include "libbfd.h"
  32. #include <aout/aout64.h>
  33. #include "aout/stab_gnu.h"
  34. #include "aout/ar.h"
  35. #include "libaout.h"           /* BFD a.out internal data structures */
  36.  
  37. const bfd_target *encap_real_callback ();
  38.  
  39. const bfd_target *
  40. encap_object_p (abfd)
  41.      bfd *abfd;
  42. {
  43.   unsigned char magicbuf[4]; /* Raw bytes of magic number from file */
  44.   unsigned long magic;        /* Swapped magic number */
  45.   short coff_magic;
  46.   struct external_exec exec_bytes;
  47.   struct internal_exec exec;
  48.  
  49.   if (bfd_read ((PTR)magicbuf, 1, sizeof (magicbuf), abfd) !=
  50.       sizeof (magicbuf))
  51.     {
  52.       if (bfd_get_error () != bfd_error_system_call)
  53.     bfd_set_error (bfd_error_wrong_format);
  54.       return 0;
  55.     }
  56.   
  57.   coff_magic = bfd_h_get_16 (abfd, magicbuf);
  58.   if (coff_magic != COFF_MAGIC)
  59.     return 0;            /* Not an encap coff file */
  60.  
  61.   __header_offset_temp==COFF_MAGIC ? sizeof(struct coffheader) : 0)
  62.   (fseek ((f), HEADER_OFFSET((f)), 1))
  63.  
  64.   magic = bfd_h_get_32 (abfd, magicbuf);
  65.  
  66.   if (N_BADMAG (*((struct internal_exec *) &magic))) return 0;
  67.  
  68.   struct external_exec exec_bytes;
  69.   if (bfd_read ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd)
  70.       != EXEC_BYTES_SIZE) {
  71.     if (bfd_get_error () != bfd_error_system_call)
  72.       bfd_set_error (bfd_error_wrong_format);
  73.     return 0;
  74.   }
  75.   NAME(aout,swap_exec_header_in)(abfd, &exec_bytes, &exec);
  76.  
  77.   return aout_32_some_aout_object_p (abfd, &exec, encap_realcallback);
  78. }
  79.  
  80. /* Finish up the reading of a encapsulated-coff a.out file header */
  81. const bfd_target *
  82. encap_real_callback (abfd)
  83.      bfd *abfd;
  84. {
  85.   struct internal_exec *execp = exec_hdr (abfd);
  86.   
  87.   MY(callback)(abfd, execp);
  88.   
  89.   /* If we have a coff header, it can give us better values for
  90.      text_start and exec_data_start.  This is particularly useful
  91.      for remote debugging of embedded systems.  */
  92.   if (N_FLAGS(exec_aouthdr) & N_FLAGS_COFF_ENCAPSULATE)
  93.   {
  94.       struct coffheader ch;
  95.       int val;
  96.       val = lseek (execchan, -(sizeof (AOUTHDR) + sizeof (ch)), 1);
  97.       if (val == -1)
  98.           perror_with_name (filename);
  99.       val = myread (execchan, &ch, sizeof (ch));
  100.       if (val < 0)
  101.           perror_with_name (filename);
  102.       text_start = ch.text_start;
  103.       exec_data_start = ch.data_start;
  104.   } else
  105.      {
  106.       text_start =
  107.         IS_OBJECT_FILE (exec_aouthdr) ? 0 : N_TXTADDR (exec_aouthdr);
  108.       exec_data_start = IS_OBJECT_FILE (exec_aouthdr)
  109.         ? exec_aouthdr.a_text : N_DATADDR (exec_aouthdr);
  110.   }
  111.  
  112.   /* Determine the architecture and machine type of the object file.  */
  113.   bfd_default_set_arch_mach(abfd, bfd_arch_m68k, 0); /* FIXME */
  114.  
  115.   return abfd->xvec;
  116. }
  117.  
  118. /* Write an object file in Encapsulated COFF format.
  119.    Section contents have already been written.  We write the
  120.    file header, symbols, and relocation.  */
  121.  
  122. boolean
  123. encap_write_object_contents (abfd)
  124.      bfd *abfd;
  125. {
  126.   bfd_size_type data_pad = 0;
  127.   struct external_exec exec_bytes;
  128.   struct internal_exec *execp = exec_hdr (abfd);
  129.  
  130. /****** FIXME:  Fragments from the old GNU LD program for dealing with
  131.         encap coff.  */
  132. struct coffheader coffheader;
  133. int need_coff_header;
  134.  
  135.   /* Determine whether to count the header as part of
  136.      the text size, and initialize the text size accordingly.
  137.      This depends on the kind of system and on the output format selected.  */
  138.  
  139.   N_SET_MAGIC (outheader, magic);
  140. #ifdef INITIALIZE_HEADER
  141.   INITIALIZE_HEADER;
  142. #endif
  143.  
  144.   text_size = sizeof (struct exec);
  145. #ifdef COFF_ENCAPSULATE
  146.   if (relocatable_output == 0 && file_table[0].just_syms_flag == 0)
  147.     {
  148.       need_coff_header = 1;
  149.       /* set this flag now, since it will change the values of N_TXTOFF, etc */
  150.       N_SET_FLAGS (outheader, aout_backend_info (abfd)->exec_hdr_flags);
  151.       text_size += sizeof (struct coffheader);
  152.     }
  153. #endif
  154.  
  155. #ifdef COFF_ENCAPSULATE
  156.   if (need_coff_header)
  157.     {
  158.       /* We are encapsulating BSD format within COFF format.  */
  159.       struct coffscn *tp, *dp, *bp;
  160.  
  161.       tp = &coffheader.scns[0];
  162.       dp = &coffheader.scns[1];
  163.       bp = &coffheader.scns[2];
  164.  
  165.       strcpy (tp->s_name, ".text");
  166.       tp->s_paddr = text_start;
  167.       tp->s_vaddr = text_start;
  168.       tp->s_size = text_size;
  169.       tp->s_scnptr = sizeof (struct coffheader) + sizeof (struct exec);
  170.       tp->s_relptr = 0;
  171.       tp->s_lnnoptr = 0;
  172.       tp->s_nreloc = 0;
  173.       tp->s_nlnno = 0;
  174.       tp->s_flags = 0x20;
  175.       strcpy (dp->s_name, ".data");
  176.       dp->s_paddr = data_start;
  177.       dp->s_vaddr = data_start;
  178.       dp->s_size = data_size;
  179.       dp->s_scnptr = tp->s_scnptr + tp->s_size;
  180.       dp->s_relptr = 0;
  181.       dp->s_lnnoptr = 0;
  182.       dp->s_nreloc = 0;
  183.       dp->s_nlnno = 0;
  184.       dp->s_flags = 0x40;
  185.       strcpy (bp->s_name, ".bss");
  186.       bp->s_paddr = dp->s_vaddr + dp->s_size;
  187.       bp->s_vaddr = bp->s_paddr;
  188.       bp->s_size = bss_size;
  189.       bp->s_scnptr = 0;
  190.       bp->s_relptr = 0;
  191.       bp->s_lnnoptr = 0;
  192.       bp->s_nreloc = 0;
  193.       bp->s_nlnno = 0;
  194.       bp->s_flags = 0x80;
  195.  
  196.       coffheader.f_magic = COFF_MAGIC;
  197.       coffheader.f_nscns = 3;
  198.       /* store an unlikely time so programs can
  199.        * tell that there is a bsd header
  200.        */
  201.       coffheader.f_timdat = 1;
  202.       coffheader.f_symptr = 0;
  203.       coffheader.f_nsyms = 0;
  204.       coffheader.f_opthdr = 28;
  205.       coffheader.f_flags = 0x103;
  206.       /* aouthdr */
  207.       coffheader.magic = ZMAGIC;
  208.       coffheader.vstamp = 0;
  209.       coffheader.tsize = tp->s_size;
  210.       coffheader.dsize = dp->s_size;
  211.       coffheader.bsize = bp->s_size;
  212.       coffheader.entry = outheader.a_entry;
  213.       coffheader.text_start = tp->s_vaddr;
  214.       coffheader.data_start = dp->s_vaddr;
  215.     }
  216. #endif
  217.  
  218. #ifdef COFF_ENCAPSULATE
  219.   if (need_coff_header)
  220.     mywrite (&coffheader, sizeof coffheader, 1, outdesc);
  221. #endif
  222.  
  223. #ifndef COFF_ENCAPSULATE
  224.   padfile (N_TXTOFF (outheader) - sizeof outheader, outdesc);
  225. #endif
  226.  
  227.   text_size -= N_TXTOFF (outheader);
  228.   WRITE_HEADERS(abfd, execp);
  229.   return true;
  230. }
  231.  
  232. #define MY_write_object_content encap_write_object_contents
  233. #define MY_object_p encap_object_p
  234. #define MY_exec_hdr_flags N_FLAGS_COFF_ENCAPSULATE
  235.  
  236. #include "aout-target.h"
  237.